package main
//
//import (
//	jwt "github.com/appleboy/gin-jwt"
//	"github.com/gin-gonic/gin"
//	"log"
//	"net/http"
//	"time"
//)
//
//type login struct {
//	Username string `form:"username" json:"username" binding:"required"`
//	Password string `form:"password" json:"password" binding:"required"`
//}
//var identityKey = "id"
//
//func helloHandler(c *gin.Context )  {
//	claims := jwt.ExtractClaims(c)
//	user, _ := c.Get(identityKey)
//	c.JSON(200, gin.H{
//		"userID":   claims[identityKey],
//		"userName": user.(*User).UserName,
//		"text":     "Hello World.",
//	})
//}
//type User struct {
//	UserName  string
//	FirstName string
//	LastName  string
//}
//
//func main()  {
//	r:=gin.New()
//	r.Use(gin.Logger())
//	r.Use(gin.Recovery())
//	authMiddleware,err:=jwt.New(&jwt.GinJWTMiddleware{
//		Realm: "test zone",
//		Key: []byte("secret key"),
//		Timeout: time.Hour,
//		MaxRefresh: time.Hour,
//		IdentityKey: identityKey,
//		PayloadFunc: func(data interface{}) jwt.MapClaims {
//			if v,ok:=data.(*User);ok {
//				return jwt.MapClaims{
//					identityKey: v.UserName,
//				}
//			}
//			return jwt.MapClaims{}
//		},
//		IdentityHandler: func(c *gin.Context) interface{} {
//			claims:=jwt.ExtractClaims(c)
//			return &User{
//				UserName: claims[identityKey].(string),
//			}
//		},
//		Authenticator: func(c *gin.Context) (interface{}, error) {
//			var loginVals login
//			err:=c.ShouldBind(&loginVals);
//			if err!=nil {
//				return "",jwt.ErrMissingLoginValues
//			}
//			userID:=loginVals.Username
//			password:=loginVals.Password
//			if (userID=="admin"&&password=="admin")||(userID=="test"&&password=="test") {
//				return &User{
//					UserName: userID,
//					LastName: "BoYi",
//					FirstName: "Wu",
//				},nil
//			}
//			return nil,jwt.ErrFailedAuthentication
//		},
//		Authorizator: func(data interface{}, c *gin.Context) bool {
//			if v,ok:=data.(*User);ok&&v.UserName=="admin" {
//				return true
//			}
//			return false
//		},
//		Unauthorized: func(c *gin.Context, code int, message string) {
//			c.JSON(code,gin.H{
//				"code":code,
//				"message":message,
//			})
//		},
//		TokenLookup:"header: Authorization, query: token, cookie: jwt",
//		TokenHeadName: "Bearer",
//		TimeFunc: time.Now,
//	})
//	if err!=nil{
//		log.Fatal("jwt err:"+err.Error())
//	}
//	errInit := authMiddleware.MiddlewareInit()
//
//	if errInit != nil {
//		log.Fatal("authMiddleware.MiddlewareInit() Error:" + errInit.Error())
//	}
//
//	r.POST("/login", authMiddleware.LoginHandler)
//
//	r.NoRoute(authMiddleware.MiddlewareFunc(), func(c *gin.Context) {
//		claims := jwt.ExtractClaims(c)
//		log.Printf("NoRoute claims: %#v\n", claims)
//		c.JSON(404, gin.H{"code": "PAGE_NOT_FOUND", "message": "Page not found"})
//	})
//
//	auth := r.Group("/auth")
//	// Refresh time can be longer than token timeout
//	auth.GET("/refresh_token", authMiddleware.RefreshHandler)
//	auth.Use(authMiddleware.MiddlewareFunc())
//	{
//		auth.GET("/hello", helloHandler)
//	}
//
//	if err := http.ListenAndServe(":8080", r); err != nil {
//		log.Fatal(err)
//	}
//}
